using System;
using System.Data;
using System.Collections;

namespace SQLToNeo.Model
{
	/// <summary>
	/// RestrictionChecker
	/// </summary>
	public class RestrictionChecker
	{
		private DataSet _currentDataset;
		private ArrayList _conflicts;
		
		#region Porperty get Conflicts
		public ArrayList Conflicts
		{
			get { return _conflicts; }
		}
		#endregion

		public RestrictionChecker()
		{
			_currentDataset = new DataSet();
			_conflicts = new ArrayList();
		}

		public void Validate(DataSet ds)
		{
			_currentDataset = ds;
			PrimaryKeyConflicts();
			ForeignKeyConflicts("foreignkey");
			ForeignKeyConflicts("iforeignkey");
		}

		private void PrimaryKeyConflicts()
		{
			foreach(DataRow dr in _currentDataset.Tables["column"].Rows)
			{
				if(dr["create"].ToString().Length == 0)
					continue;
				if(Convert.ToBoolean(dr["primaryKey"].ToString()) 
					&& !Convert.ToBoolean(dr["create"].ToString()))
				{
					string c = "Conflict: Col '" + dr["javaName"].ToString() + "' is primray key of table '" + GetTableName(dr["tableid"].ToString()) + "' and must be build!";
					_conflicts.Add(c);
				}
			}
		}

		private void ForeignKeyConflicts(string table)
		{
			foreach(DataRow dr in _currentDataset.Tables[table].Rows)
			{
				string select = "name = '"+dr["foreign"].ToString()+"' and tableid = '"+ GetTableId(dr["foreigntable"].ToString()) +"'";
				DataRow[] dra = _currentDataset.Tables["column"].Select(select);
				if(dra.Length > 0)
				{
					if(!Convert.ToBoolean(dra[0]["create"].ToString()) 
						&& Convert.ToBoolean(dr["create"].ToString()))
					{
						string c = "Conflict: The "+table+" col '"+dra[0]["name"].ToString()+"' of table '"+GetTableName(dr["tableid"].ToString())+"' is set create to and the relation is set create to true!";
						_conflicts.Add(c);
					}
					if(!CreateTable(dra[0]["tableid"].ToString()) 
						&& Convert.ToBoolean(dr["create"].ToString()))
					{
						string c = "Conflict: The table '"+GetTableName(dra[0]["tableid"].ToString())+"' is set to create = false, but there where "+table+" relations from table '"+GetTableName(dr["tableid"].ToString())+"' that points to cols of that table";
						_conflicts.Add(c);
					}
				}
			}
		}

		private bool CreateTable(string tableid)
		{
			DataRow[] dra = _currentDataset.Tables["table"].Select("id = '"+tableid+"'");
			if(dra.Length > 0)
				return Convert.ToBoolean(dra[0]["create"].ToString());
			return false;
		}

		private string GetTableId(string tablename)
		{
			DataRow[] dra = _currentDataset.Tables["table"].Select("name = '" + tablename + "'");
			if(dra.Length > 0)
				return dra[0]["id"].ToString();
			return "Unknown";
		}

		private string GetTableName(string tableid)
		{
			DataRow[] dra = _currentDataset.Tables["table"].Select("id = '"+tableid+"'");
			if(dra.Length > 0)
				return dra[0]["name"].ToString();
			return "Unknown";
		}
	}
}
